//Библиотека Qt.
#include <QtGui>


//Внутренняя библиотека.
#include "vidwidget.h"
#include "devmanager.h"
#include "viddevice.h"
#include "devparamswidget.h"
#include "devcolorsdialog.h"


//===========================================================================//
//=Заголовок: VidWidget::VidWidget() - public
//=Параметры:
//=Описание: Конструктор.
//===========================================================================//
VidWidget::VidWidget(int index, QWidget *parent) : QWidget(parent)
{
qRegisterMetaType<DevParam::SET_PARAM>();

vidIndex = index; devIndex = -1; ctxMenu = NULL;

//Установить свойство виджета.
setProperty("VidWidget", true);

//Установить правила изменения размеров виджета.
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

//Установить фон виджета в чёрный цвет.
QPalette palette;
palette.setColor(QPalette::Window, Qt::black);
setPalette(palette);
}


//===========================================================================//
//=Заголовок: QSize VidWidget::sizeHint() const - public
//=Параметры:
//=Описание: Функция возврата рекомендуемых размеров видеоокна.
//===========================================================================//
QSize VidWidget::sizeHint() const {return QSize(160, 120);}


//===========================================================================//
//=Заголовок: QStringList VidWidget::getTypesList() - public
//=Параметры:
//=Описание: Функция возврата списка типов видеоокон.
//===========================================================================//
QStringList VidWidget::getTypesList()
{
QStringList wintypeslist;
wintypeslist << "OPENGL" << "XVIDEO";
return wintypeslist;
}


//===========================================================================//
//=Заголовок: QString VidWidget::typeToString() - public
//=Параметры:
//=Описание: Функция конвертации типа видеоокна в строку.
//===========================================================================//
QString VidWidget::typeToString(VidWidget::WINTYPE wintype)
{
QString wintypestr;
switch(wintype)
	{
	case OPENGL: wintypestr = "OPENGL"; break;
	case XVIDEO: wintypestr = "XVIDEO"; break;
}
return wintypestr;
}


//===========================================================================//
//=Заголовок: void VidWidget::setDeviceManager() - public
//=Параметры:
//=Описание: Функция установки менеджера устройств.
//===========================================================================//
void VidWidget::setDeviceManager(DevManager *devmanager)
{devManager = devmanager;}


//===========================================================================//
//=Заголовок: int VidWidget::getIndex() - public
//=Параметры:
//=Описание: Функция возврата индекса видеоокна.
//===========================================================================//
int VidWidget::getIndex() {return vidIndex;}


//===========================================================================//
//=Заголовок: int VidWidget::getDeviceIndex() - public
//=Параметры:
//=Описание: Функция возврата индекса видеоустройства.
//===========================================================================//
int VidWidget::getDeviceIndex() {return devIndex;}


//===========================================================================//
//=Заголовок: void VidWidget::connectVideoDevice() - public
//=Параметры:
//=Описание: Функция подключения видеоустройства.
//===========================================================================//
void VidWidget::connectVideoDevice(VidDevice *viddev)
{
if(!vidDev.isNull())
	{
	emit sigSetParam(DevParam::SET_VIDEOWINDOW, NULL);
	disconnect(this, SIGNAL(sigSetParam(DevParam::SET_PARAM, QObject *)), vidDev, SIGNAL(sigSetParam(DevParam::SET_PARAM, QObject *)));
	devIndex = -1;
}

vidDev = viddev;

if(!vidDev.isNull())
	{
	connect(this, SIGNAL(sigSetParam(DevParam::SET_PARAM, QObject *)), vidDev, SIGNAL(sigSetParam(DevParam::SET_PARAM, QObject *)), Qt::DirectConnection);
	emit sigSetParam(DevParam::SET_VIDEOWINDOW, this);
	devIndex = vidDev->getIndex();
}
}


//===========================================================================//
//=Заголовок: VidDevice *VidWidget::getDevice() - public
//=Параметры:
//=Описание: Функция возврата указателя на видеоустройство.
//===========================================================================//
VidDevice *VidWidget::getDevice()
{
if(vidDev.isNull()) return NULL;
return vidDev.data();
}


//===========================================================================//
//=Заголовок: void VidWidget::mouseReleaseEvent() - protected
//=Параметры:
//=Описание: Событие отпускания кнопки мыши.
//===========================================================================//
void VidWidget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton) {event->ignore(); return;}
if(vidDev.isNull()) {event->ignore(); return;}

//Создать контекстное меню.
ctxMenu = new QMenu(vidDev->getBaseName(), this);
ctxMenu->addAction(tr("Наименование устройства..."), this, SLOT(slotChangeDeviceName()));
ctxMenu->addAction(tr("Параметры устройства..."), this, SLOT(slotShowDeviceParameters()));
ctxMenu->addAction(tr("Цветовые настройки..."), this, SLOT(slotShowColorParameters()));
ctxMenu->exec(event->globalPos());
delete ctxMenu; ctxMenu = NULL;

event->accept();
}


//===========================================================================//
//=Заголовок: void VidWidget::slotChangeDeviceName() - private slots
//=Параметры:
//=Описание: Слот вызова диалога смены наименования видеоустройства.
//===========================================================================//
void VidWidget::slotChangeDeviceName()
{
if(vidDev.isNull()) return;
bool ok;
QString label = tr("Введите новое имя для видеоустройства.\n\nВажно: кириллица не поддерживается!\n");
QString	name = QInputDialog::getText(this, tr("Наименование видеоустройства"), label, QLineEdit::Normal, vidDev->getBaseName(), &ok);
if(!ok) return;
vidDev->setBaseName(name);
}


//===========================================================================//
//=Заголовок: void VidWidget::slotShowDeviceParameters() - private slots
//=Параметры:
//=Описание: Слот вызова диалога параметров видеоустройства.
//===========================================================================//
void VidWidget::slotShowDeviceParameters()
{
if(devManager.isNull()) return;
if(vidDev.isNull()) return;

//Выбрать устройство.
devManager->selectDevice(vidDev.data());

DevParamsWidget *devparamswdg = new DevParamsWidget(devManager, this, Qt::Dialog);
devparamswdg->setWindowModality(Qt::ApplicationModal);
devparamswdg->setAttribute(Qt::WA_DeleteOnClose, true);
devparamswdg->setWindowTitle(vidDev->getBaseName());
connect(devparamswdg, SIGNAL(information(const QString &)), this, SIGNAL(information(const QString &)));
connect(devparamswdg, SIGNAL(warning(const QString &)), this, SIGNAL(warning(const QString &)));
connect(devparamswdg, SIGNAL(critical(const QString &)), this, SIGNAL(critical(const QString &)));
devparamswdg->show();
}


//===========================================================================//
//=Заголовок: void VidWidget::slotShowColorParameters() - private slots
//=Параметры:
//=Описание: Слот вызова диалога цветовых настроек.
//===========================================================================//
void VidWidget::slotShowColorParameters()
{
if(vidDev.isNull()) return;
DevColorsDialog *devcolorsdlg = new DevColorsDialog(vidDev.data(), this);
devcolorsdlg->setWindowTitle(vidDev->getBaseName());
connect(devcolorsdlg, SIGNAL(information(const QString &)), this, SIGNAL(information(const QString &)));
connect(devcolorsdlg, SIGNAL(warning(const QString &)), this, SIGNAL(warning(const QString &)));
connect(devcolorsdlg, SIGNAL(critical(const QString &)), this, SIGNAL(critical(const QString &)));
devcolorsdlg->exec();
delete devcolorsdlg;
}
